package com.example.autofittextviewsample;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextUtils.TruncateAt;
import android.text.TextWatcher;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewTreeObserver.OnPreDrawListener;
import android.widget.EditText;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import com.lb.auto_fit_textview.AutoResizeTextView;
public class MainActivity extends AppCompatActivity {
// private final Random _random =new Random();
// private static final String ALLOWED_CHARACTERS ="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890";
private EditText _contentEditText;
private ViewGroup _textViewcontainer;
private SeekBar _widthSeekBar;
private SeekBar _heightSeekBar;
private TextView _linesCountTextView;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
_textViewcontainer = (ViewGroup) findViewById(R.id.container);
_contentEditText = (EditText) findViewById(R.id.contentEditText);
_contentEditText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {
}
@Override
public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {
}
@Override
public void afterTextChanged(final Editable s) {
recreateTextView();
}
});
_widthSeekBar = (SeekBar) findViewById(R.id.widthSeekBar);
_heightSeekBar = (SeekBar) findViewById(R.id.heightSeekBar);
final OnSeekBarChangeListener seekBarChangeListener = new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(final SeekBar seekBar) {
}
@Override
public void onStartTrackingTouch(final SeekBar seekBar) {
}
@Override
public void onProgressChanged(final SeekBar seekBar, final int progress, final boolean fromUser) {
recreateTextView();
}
};
_heightSeekBar.setOnSeekBarChangeListener(seekBarChangeListener);
_widthSeekBar.setOnSeekBarChangeListener(seekBarChangeListener);
_linesCountTextView = (TextView) findViewById(R.id.linesCountTextView);
findViewById(R.id.plusLineCountButton).setOnClickListener(new OnClickListener() {
@Override
public void onClick(final View v) {
int maxLinesCount = Integer.parseInt(_linesCountTextView.getText().toString());
_linesCountTextView.setText(Integer.toString(++maxLinesCount));
recreateTextView();
}
});
findViewById(R.id.minusLineCountButton).setOnClickListener(new OnClickListener() {
@Override
public void onClick(final View v) {
int maxLinesCount = Integer.parseInt(_linesCountTextView.getText().toString());
if (maxLinesCount == 1)
return;
_linesCountTextView.setText(Integer.toString(--maxLinesCount));
recreateTextView();
}
});
runJustBeforeBeingDrawn(_textViewcontainer, new Runnable() {
@Override
public void run() {
recreateTextView();
}
});
}
protected void recreateTextView() {
_textViewcontainer.removeAllViews();
final int maxWidth = _textViewcontainer.getWidth();
final int maxHeight = _textViewcontainer.getHeight();
final AutoResizeTextView textView = new AutoResizeTextView(MainActivity.this);
textView.setGravity(Gravity.CENTER);
final int width = _widthSeekBar.getProgress() * maxWidth / _widthSeekBar.getMax();
final int height = _heightSeekBar.getProgress() * maxHeight / _heightSeekBar.getMax();
final int maxLinesCount = Integer.parseInt(_linesCountTextView.getText().toString());
textView.setMaxLines(maxLinesCount);
textView.setTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, maxHeight, getResources().getDisplayMetrics()));
textView.setEllipsize(TruncateAt.END);
// since we use it only once per each click, we don't need to cache the results, ever
textView.setLayoutParams(new LayoutParams(width, height));
textView.setBackgroundColor(0xff00ff00);
final String text = _contentEditText.getText().toString();
textView.setText(text);
_textViewcontainer.addView(textView);
}
// private String getRandomText()
// {
// final int textLength=_random.nextInt(20)+1;
// final StringBuilder builder=new StringBuilder();
// for(int i=0;i<textLength;++i)
// builder.append(ALLOWED_CHARACTERS.charAt(_random.nextInt(ALLOWED_CHARACTERS.length())));
// return builder.toString();
// }
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
String url = null;
switch (item.getItemId()) {
case R.id.menuItem_all_my_apps:
url = "https://play.google.com/store/apps/developer?id=AndroidDeveloperLB";
break;
case R.id.menuItem_all_my_repositories:
url = "https://github.com/AndroidDeveloperLB";
break;
case R.id.menuItem_current_repository_website:
url = "https://github.com/AndroidDeveloperLB/AutoFitTextView";
break;
case R.id.menuItem_show_recyclerViewSample:
startActivity(new Intent(this, Main2Activity.class));
return true;
}
if (url == null)
return true;
final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
startActivity(intent);
return true;
}
public static void runJustBeforeBeingDrawn(final View view, final Runnable runnable) {
final OnPreDrawListener preDrawListener = new OnPreDrawListener() {
@Override
public boolean onPreDraw() {
runnable.run();
view.getViewTreeObserver().removeOnPreDrawListener(this);
return true;
}
};
view.getViewTreeObserver().addOnPreDrawListener(preDrawListener);
}
}